package com.zhongshan.ga.mobile.logic;

import org.apache.ibatis.session.SqlSession;
import org.restlet.representation.Representation;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.zhongshan.ga.commonvar.ArgsConfig;
import com.zhongshan.ga.commonvar.CommendConfig;
import com.zhongshan.ga.logger.GenerateLog;
import com.zhongshan.ga.mobile.tools.JsonResultUtils;
import com.zhongshan.ga.mobile.tools.UserInfoMap;
import com.zhongshan.ga.mobile.tools.UserInfosBean;
import com.zhongshan.ga.mybatis.bean.LoginWayInfo;
import com.zhongshan.ga.mybatis.bean.PeopleInfoBean;
import com.zhongshan.ga.mybatis.bean.UserHeadImg;
import com.zhongshan.ga.mybatis.dao.ILoginWayInfoDao;
import com.zhongshan.ga.mybatis.dao.IPeopleInfoDao;
import com.zhongshan.ga.utils.MyBatisUtil;

/**
 * 登陆信息处理逻辑类
 * 
 * @author kakaxi
 * 
 */
public class LoginWayInfoLogic extends ParentLogic {

	/**
	 * 登陆信息数据库访问接口
	 */
	private ILoginWayInfoDao loginWayInfoDao;

	/**
	 * 用户信息数据库访问接口
	 */
	private IPeopleInfoDao peopleInfoDao;

	/**
	 * 用户登陆逻辑处理
	 * 
	 * @param representation
	 * @return
	 */
	public JsonObject login(Representation representation) {
		SqlSession session = MyBatisUtil.getSqlSession(true);
		loginWayInfoDao = session.getMapper(ILoginWayInfoDao.class);
		peopleInfoDao = session.getMapper(IPeopleInfoDao.class);

		JsonObject resultJson = new JsonObject();
		try {
			JsonObject acceptJson = getJsonFromRequest(representation);
			// 检查操作码是否匹配
			resultJson = basicCheck(acceptJson, CommendConfig.USER_LOGIN, false);
			GenerateLog.outDebug("检查后：" + resultJson);
			if (resultJson.get(ArgsConfig.RESULT_CODE).getAsString()
					.equals(ArgsConfig.RESPONSE_SUCCESS)) {
				// 取出json请求中的data请求数据
				if (acceptJson.get(ArgsConfig.REQUEST_DATA) != null) {
					// 获得data节点下的请求数据
					JsonObject dataJson = acceptJson.get(
							ArgsConfig.REQUEST_DATA).getAsJsonObject();
					GenerateLog.outDebug("data节点" + dataJson);
					JsonObject resultdataJsonObject = dataJson.get(ArgsConfig.RESULT_DATA).getAsJsonObject();
					// 获得PeopleInfo节点下的数据
					JsonObject peopleInfoJsonObject = resultdataJsonObject.get("peopleInfo").getAsJsonObject();
					// 获得userHeadImg节点下的数据
					JsonObject userHeadImgJsonObject = resultdataJsonObject.get("userHeadImg").getAsJsonObject();
					
					// 用户信息
					PeopleInfoBean peopleInfoBean = new PeopleInfoBean();
					peopleInfoBean.setNickName(peopleInfoJsonObject.get("nickName").getAsString());
					if(peopleInfoJsonObject.get("sex").getAsString().equals("0")|| peopleInfoJsonObject.get("sex").getAsString() == "0") {
						peopleInfoBean.setSex("女");
					} else if(peopleInfoJsonObject.get("sex").getAsString().equals("1")|| peopleInfoJsonObject.get("sex").getAsString() == "1") {
						peopleInfoBean.setSex("男");
					} else {
						peopleInfoBean.setSex(peopleInfoJsonObject.get("sex").getAsString());
					}
					peopleInfoBean.setIsVip("0");
					
					// 用户头像信息
					UserHeadImg userHeadImg = new UserHeadImg();
					userHeadImg.setHeadImgUrl(userHeadImgJsonObject.get("headImgUrl").getAsString());
					userHeadImg.setIsActivity(userHeadImgJsonObject.get("isActivity").getAsInt());
					
					LoginWayInfo loginWayInfo = new LoginWayInfo();
					loginWayInfo.setIsActivity(resultdataJsonObject.get("isActivity").getAsInt());
					loginWayInfo.setqQLoginId(resultdataJsonObject.get("qQLoginId").getAsString());
					loginWayInfo.setPeopleInfo(peopleInfoBean);
					loginWayInfo.setUserHeadImg(userHeadImg);
					
					//LoginWayInfo requestInfo = new Gson().fromJson(dataJson,
							//LoginWayInfo.class);
					//GenerateLog.outDebug("转换后的" + new Gson().toJson(requestInfo));
					// 检查是否已存在用户信息
					LoginWayInfo resultInfo = checkExistPeopleInfo(loginWayInfo);
					if (resultInfo == null) {
						// 当不存在时就会进行自动注册, 创建用户系统编码并把数据添加到数据库中
						resultInfo = addInfoToReg(loginWayInfo);
						if (resultInfo == null) {
							GenerateLog
									.outDebug("*************login 注册失败****************************");
							return JsonResultUtils.createResultJson(
									CommendConfig.USER_LOGIN, "注册失败", false);
						}
						GenerateLog
								.outDebug("*************login 注册成功****************************");
					}

					// 当数据库已存在此信息时,再把用户信息添加进去
					PeopleInfoBean peopleInfo = peopleInfoDao
							.getPeopleInfoByCode(resultInfo
									.getPeopleSystemCode());
					resultInfo.setPeopleInfo(peopleInfo);
					//loginWayInfoDao.updateUserHeadImg(peopleSystemCode)
					// 加入头像链接
					UserHeadImg userHeadImg1 = loginWayInfoDao.getUserHeadImg(resultInfo
									.getPeopleSystemCode());
					// resultInfo.setHeadUrl(userHeadImg.getHeadUrl());
					resultInfo.setUserHeadImg(userHeadImg1);
					// 当数据库已存在此信息时, 自动生成token 并完成登录
					String token = doLogin(acceptJson, resultInfo);
					// 检查token以及登陆信息的生成情况
					if (token != null) {
						GenerateLog
								.outDebug("*************login 登陆成功****************************");
						resultJson.addProperty(ArgsConfig.TOKEN, token);
						GenerateLog.outDebug("成功后" + resultJson);
						/**
						 * 将新的数据封装后返回客户端
						 */
						JsonObject piObject = new JsonParser().parse(new Gson().toJson(peopleInfo)).getAsJsonObject();
						GenerateLog.outDebug("新的用户信息" + piObject);
						JsonObject uiJsonObject = new JsonParser().parse(new Gson().toJson(userHeadImg1)).getAsJsonObject();
						GenerateLog.outDebug("新的用户信息" + piObject);
						JsonObject dataJo = resultJson.get(ArgsConfig.REQUEST_DATA).getAsJsonObject();
						// 取出客户端的提交的数据，将新的用户信息包装进去
						JsonObject resultJsonO = dataJo.get(ArgsConfig.RESULT_DATA).getAsJsonObject();
						GenerateLog.outDebug("旧的数据" + resultJsonO);
						resultJsonO.add("peopleInfo", piObject);
						GenerateLog.outDebug("加入新的用户 信息" + resultJsonO);
						resultJsonO.add("userHeadImg", uiJsonObject);
						GenerateLog.outDebug("加入新的头像信息" + resultJsonO);
						dataJo.add(ArgsConfig.RESULT_DATA, resultJsonO);
						GenerateLog.outDebug("再包装"+ dataJo);
						resultJson.add(ArgsConfig.REQUEST_DATA, dataJo);
						GenerateLog.outDebug("最后包装"+resultJson);
					} else {
						GenerateLog
								.outDebug("*************login token不存在,请重新登陆****************************");
						resultJson = JsonResultUtils.createResultJson(
								CommendConfig.USER_LOGIN, "请重新登陆", false);
					}

				}
			}

		} catch (Exception e) {
			e.printStackTrace();
			GenerateLog
					.outDebug("*************login 请求数据取出出错****************************");
			resultJson = JsonResultUtils.createResultJson(
					CommendConfig.USER_LOGIN, "请求数据出错", false);
		} finally {
			session.close();
		}

		GenerateLog
				.outDebug("*************login 逻辑处理结果****************************");
		GenerateLog.outDebug(resultJson.toString());

		return resultJson;
	}

	/**
	 * 检查用户信息请求
	 * 
	 * @param requestInfo
	 *            请求里的用户信息数据类
	 */
	private LoginWayInfo checkExistPeopleInfo(LoginWayInfo requestInfo) {
		LoginWayInfo loginWayInfo = null;
		String account = null;

		// QQ账号查询
		account = requestInfo.getqQLoginId();
		if (account != null && !account.trim().equals("")) {
			loginWayInfo = loginWayInfoDao.getLoginWayInfoByQQ(account.trim());
			if (loginWayInfo != null) {
				return loginWayInfo;
			}
		}

		// 微信账号查询
		account = requestInfo.getWeChatLoginID();
		if (account != null && !account.trim().equals("")) {
			loginWayInfo = loginWayInfoDao.getLoginWayInfoByWechat(account
					.trim());
			if (loginWayInfo != null) {
				return loginWayInfo;
			}
		}

		// 微博账号查询
		account = requestInfo.getWeiboLoginID();
		if (account != null && !account.trim().equals("")) {
			loginWayInfo = loginWayInfoDao.getLoginWayInfoByWeibo(account
					.trim());
			if (loginWayInfo != null) {
				return loginWayInfo;
			}
		}

		// 邮箱账号查询
		account = requestInfo.getEmailLoginID();
		if (account != null && !account.trim().equals("")) {
			loginWayInfo = loginWayInfoDao.getLoginWayInfoByEmail(account
					.trim());
			if (loginWayInfo != null) {
				return loginWayInfo;
			}
		}

		// 电话号码查询
		account = requestInfo.getPhoneLoginID();
		if (account != null && !account.trim().equals("")) {
			loginWayInfo = loginWayInfoDao.getLoginWayInfoByPhone(account
					.trim());
			if (loginWayInfo != null) {
				return loginWayInfo;
			}
		}

		// facebook账号查询
		account = requestInfo.getFaceBookLoginID();
		if (account != null && !account.trim().equals("")) {
			loginWayInfo = loginWayInfoDao.getLoginWayInfoByFaceBook(account
					.trim());
			if (loginWayInfo != null) {
				return loginWayInfo;
			}
		}

		return null;
	}

	/**
	 * 添加新的用户信息 完成注册
	 * 
	 * @param newInfo
	 *            新的用户信息
	 */
	private LoginWayInfo addInfoToReg(LoginWayInfo newInfo) {
		GenerateLog.outDebug("NewInfo" + new Gson().toJson(newInfo));
		// 生成用户编码
		String peopleSystemCode = System.currentTimeMillis() + "";
		newInfo.setPeopleSystemCode(peopleSystemCode);
		newInfo.getPeopleInfo().setPeopleSystemCode(peopleSystemCode);
		//newInfo.getUserHeadImg().setPeopleSystemCode(peopleSystemCode);
		// 添加用户信息
		int result = peopleInfoDao.addPeopleInfo(newInfo.getPeopleInfo());
		if (result != 0) {
			// 添加用户头像信息
			//UserHeadImg headImg = new UserHeadImg();
			//newInfo.setUserHeadImg(headImg);
			// headImg.setPeopleInfoBean(newInfo.getPeopleInfo());
			newInfo.getUserHeadImg().setPeopleSystemCode(peopleSystemCode);
			/*if (newInfo.getHeadUrl() != null) {
				headImg.setHeadUrl(newInfo.getHeadUrl());
			} else {
				// 当没头像时 就会设置个空的头像, 为了创建成功
				headImg.setHeadUrl("");
			}*/
			//loginWayInfoDao.addUserHeadImg(headImg);
			// 将原有的头像停用
			loginWayInfoDao.updateUserHeadImg(peopleSystemCode);
			// 添加新的用户头像
			loginWayInfoDao.addUserHeadImg(newInfo.getUserHeadImg());
			// 添加登陆方式信息
			loginWayInfoDao.addLoginWayInfo(newInfo);
			return newInfo;
		} else {
			return null;
		}
	}

	/**
	 * 做登陆操作, 生成token和用户信息
	 * 
	 * @param acceptJson
	 *            json请求数据
	 * @param resultInfo
	 *            注册或者从数据库中取出的 结果用户信息
	 * @return
	 */
	private String doLogin(JsonObject acceptJson, LoginWayInfo resultInfo) {
		String token = null;
		UserInfosBean userInfosBean = null;

		if (acceptJson.get(ArgsConfig.TOKEN) != null) {
			// 处理用户已经登陆过的
			token = acceptJson.get(ArgsConfig.TOKEN).getAsString();
			// 处理 token已经存在,但缓存中没有用户登陆信息
			if (UserInfoMap.getUserInfos(token) != null) {
				GenerateLog
						.outDebug("*************login token存在,用户登陸信息也存在****************************");
				return token;
			} else {
				GenerateLog
						.outDebug("*************login token存在,用户登陸信息不存在****************************");
				return null;
			}
		} else {
			// 当不存在token时, 生成token和用户登陆信息
			userInfosBean = new UserInfosBean();
			userInfosBean.setPeopleSystemCode(resultInfo.getPeopleSystemCode());
			userInfosBean.setFlag(judgeLoginType(resultInfo));
			userInfosBean.setFansTime(10 * 60 * 3600); // 10小时
			userInfosBean.setmD5String("");
			userInfosBean.setPassword("");
			userInfosBean.setLoginWayInfo(resultInfo);
			token = System.currentTimeMillis() + "_"
					+ (int) (Math.random() * 9999 + 1000);
			// 保存到缓存中, 并返回token
			boolean result = UserInfoMap.setUserInfos(token, userInfosBean);
			if (result) {
				GenerateLog
						.outDebug("*************login 用户登陸信息生成成功****************************");
				return token;
			} else {
				GenerateLog
						.outDebug("*************login 用户登陸信息生成失败****************************");
				return null;
			}
		}
	}

	/**
	 * 判断登录的类型 1.微信 2.QQ 3.微博 4.邮箱 5.手机 6.facebook
	 * 
	 * @param loginWayInfo
	 *            用户信息类
	 * @return
	 */
	private int judgeLoginType(LoginWayInfo loginWayInfo) {
		if (loginWayInfo.getWeChatLoginID() != null
				&& !loginWayInfo.getWeChatLoginID().trim().equals("")) {
			return 1;
		}
		if (loginWayInfo.getqQLoginId() != null
				&& !loginWayInfo.getqQLoginId().trim().equals("")) {
			return 2;
		}
		if (loginWayInfo.getWeiboLoginID() != null
				&& !loginWayInfo.getWeiboLoginID().trim().equals("")) {
			return 3;
		}
		if (loginWayInfo.getEmailLoginID() != null
				&& !loginWayInfo.getEmailLoginID().trim().equals("")) {
			return 4;
		}
		if (loginWayInfo.getPhoneLoginID() != null
				&& !loginWayInfo.getPhoneLoginID().trim().equals("")) {
			return 5;
		}
		if (loginWayInfo.getFaceBookLoginID() != null
				&& !loginWayInfo.getFaceBookLoginID().trim().equals("")) {
			return 6;
		}
		return -1;
	}

}
